package com.zp.self.module.level_4_算法练习.数据结构.String;
import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_859_亲密字符串 {
    @Test
    public void main() {
        
        Solution solution = new 力扣_859_亲密字符串().new Solution();
        System.out.println(solution.buddyStrings("ab",
                "ba"));
    }

    /**
     题目：给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
         交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
         例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

     示例 1：
     输入：s = "ab", goal = "ba"
     输出：true
     解释：你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 相等。

     示例 2：
     输入：s = "ab", goal = "ab"
     输出：false
     解释：你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 不相等。

     示例 3：
     输入：s = "aa", goal = "aa"
     输出：true
     解释：你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa"，此时 s 和 goal 相等。

     分析：【P 💔💔】
        1.遍历：a.判断两个字符是否相等，相等这查找是否有字符出现两次
               b.找到下标不同的两个字符，交换后判断是否相等
                --执行耗时:0 ms,击败了100.00% 的Java用户
                --编码耗时: 27:17

     边界值 & 注意点：
        1.
     **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean buddyStrings(String s, String goal) {
        int len1 = s.length();
        if(len1!=goal.length())
            return false;
        if(s.equals(goal)){
            boolean[] bigBit = new boolean[122];
            for (char c : s.toCharArray()) {
                if(bigBit[c])
                    return true;
                else
                    bigBit[c]= true;
            }
            return false;
        }else {
            char[] chars1 = s.toCharArray(),chars2=goal.toCharArray();
            int oneIndex=-1,twoIndex=-1;
            for (int i = 0; i < len1; i++) {
                if(chars1[i]!=chars2[i]){
                    if(oneIndex==-1){
                        oneIndex=i;
                    }else if(twoIndex==-1){
                        twoIndex=i;
                    }else
                        break;
                }
            }
            if(twoIndex==-1)
                return false;
            char temp = chars1[oneIndex];
            chars1[oneIndex] = chars1[twoIndex];
            chars1[twoIndex] = temp;
            return  String.valueOf(chars1).equals(goal);
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}